﻿using System;
using System.Runtime.InteropServices;

namespace IntegrationExample.Logic
{
    public static class WinAPI
    {

        /// <summary>
        /// Необходимо для сбора информации о файле
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public struct Shfileinfo
        {
            public IntPtr hIcon;
            public int iIcon;
            public uint dwAttributes;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
            public string szDisplayName;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
            public string szTypeName;
        }

        /// <summary>
        /// Флаги, определяющие, какие свойства файла брать
        /// </summary>
        [Flags]
        public enum Shgfi
        {
            SHGFI_LARGEICON = 0x000000000, //Модифицирует SHGFI_ICON, для того, чтобы извлечь большую иконку файла
            SHGFI_SMALLICON = 0x000000001, //Модифицирует SHGFI_ICON, для того, чтобы извлечь маленькую иконку файла
            SHGFI_OPENICON = 0x000000002, //Модифицирует SHGFI_ICON, для того, чтобы извлечь открытую иконку файла
            SHGFI_SHELLICONSIZE = 0x000000004, //Модифицирует SHGFI_ICON, для того, чтобы извлечь размер иконки в пределах оболочики Windows
            SHGFI_PIDL = 0x000000008, //Указывает, что что pszPath - адрес структуры TItemIDList а не имя пути
            SHGFI_USEFILEATTRIBUTES = 0x000000010, //Указывает, что функция не должна пытаться получить доступ к файлу pszPath
            SHGFI_ADDOVERLAYS = 0x000000020, //Применненный подходящий оверлей к иконке файла
            SHGFI_OVERLAYINDEX = 0x000000040, //Возвращает индекс оверлейной иконки
            SHGFI_ICON = 0x000000100, //Возвращает хендл и индекс(в пределах системного кеша иконок) на иконку
            SHGFI_DISPLAYNAME = 0x000000200, //Извлекает наименование объекта в пространстве имен
            SHGFI_TYPENAME = 0x000000400, //Возвращается строка, описывающая тип файла
            SHGFI_ATTRIBUTES = 0x000000800, //Возвращает аттрибуты объекта
            SHGFI_ICONLOCATION = 0x000001000, //Возвращает имя файла и инфекс иконки в предлах этого файла, указанного в pszPath
            SHGFI_EXETYPE = 0x000002000, //Возвращает тип исполняемого файла, если в pszPath путь к исполняемому приложению
            SHGFI_SYSICONINDEX = 0x000004000, //Возвращает индекс системной иконки из кеша иконок
            SHGFI_LINKOVERLAY = 0x000008000, //Модифицирует SHGFI_ICON, для того, чтобы добавить оверлей связи файловой иконки
            SHGFI_SELECTED = 0x000010000, //Модифицирует SHGFI_ICON для того, чтобы смешать икону файла, с системным световым цветом          
            SHGFI_ATTR_SPECIFIED = 0x000020000 //Модифицирует SHGFI_ATTRIBUTES. Указывает, что параметр dwAttributes содержит желательные аттрибуты
        }

        /// <summary>
        /// Возвращает информацию об объекте файловой системы (файл, папка, корень логичекого диска)
        /// </summary>
        /// <param name="pszPath">Строка которая содежит путь к файлу или папке</param>
        /// <param name="dwFileAttributes">Флаги аттрибутов файлов</param>
        /// <param name="psfi">Адрес структуры TSHFileInfo, которая получает информацию об объекте</param>
        /// <param name="cbFileInfo">Размер структуры TSHFileInfo, в байтах</param>
        /// <param name="uFlags">Флаги, опредлеяющие возвращаемую информацию</param>
        /// <returns></returns>
        [DllImport("shell32.dll", EntryPoint = "SHGetFileInfoA")]
        public static extern IntPtr SHGetFileInfo(
            string pszPath,
            int dwFileAttributes,
            ref Shfileinfo psfi,
            uint cbFileInfo,
            Shgfi uFlags);
    }
}